home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / pdisk.zip / BOOTCODE.ASM < prev    next >
Assembly Source File  |  1989-01-12  |  2KB  |  99 lines

  1.     .radix 16
  2.     public    _boot_code,_bcode_len
  3.  
  4. lowseg    segment    at 0
  5.     org    7fe
  6. signature dw    ?
  7. lowseg    ends
  8.  
  9. _DATA segment
  10.     assume    CS:_DATA, DS:lowseg, ES:lowseg
  11. _boot_code:
  12.     xor    ax,ax
  13.     mov    es,ax
  14.     mov    ds,ax
  15.     cli
  16.     mov    ss,ax
  17.     mov    sp,7c00
  18.     mov    si,sp
  19.     sti
  20.     cld
  21.     mov    di,0600
  22.     mov    cx,100
  23.     rep    movsw
  24.     ; what we WANT to do is "jmp 0:(600 + (offset did_move))" -- I can't
  25.     ; get MASM to do this.
  26.     DB    0EA
  27.     dw    600+(offset did_move - offset _boot_code)
  28.     dw    0
  29. did_move:
  30.     mov    dx,600+(offset no_sig - offset _boot_code)
  31.     cmp    signature,0aa55
  32.     jne    error
  33.     mov    si,7be
  34.     mov    cx,4
  35.     mov    di,0
  36.     mov    dx,600+(offset inv_table - offset _boot_code)
  37. check_loop:
  38.     lodsb
  39.     or    al,al        ; if zero, ignore
  40.     jz    check_next
  41.     cmp    al,80        ; if not zero, only 80 is allowed
  42.     jne    error
  43.     or    di,di        ; if not zero, we have two bootable partitions
  44.     jne    error
  45.     mov    di,si        ; save ptr to bootable system and continue
  46. check_next:
  47.     add    si,0f        ; bump partition pointer
  48.     loop    check_loop    ; and scan next partition, if any
  49.     or    di,di        ; checked all. do init if we got a valid boot partition
  50.     jnz    do_init
  51.     int    18        ; else invoke ROM BASIC
  52. error:
  53.     mov    ah,0e        ; "tty write"
  54. wr_err:    lodsb
  55.     or    al,al
  56.     jz    did_err
  57.     int    10
  58.     jmp    short wr_err
  59. did_err:
  60.     mov    al,0dh
  61.     int    10
  62.     mov    al,0a
  63.     int    10
  64. do_zip:
  65.     jmp    short do_zip
  66.  
  67. do_init:
  68.     mov    si,di
  69.     dec    di
  70.     lodsb
  71.     mov    dh,al
  72.     mov    dl,80
  73.     mov    bx,7c00
  74.     mov    cx,5
  75. try_read:
  76.     push    cx
  77.     mov    cx,[si]
  78.     mov    ax,201
  79.     int    13
  80.     pop    cx
  81.     jnc    go_boot
  82.     cmp    al,11            ; data corrected
  83.     je    go_boot
  84.     loop    try_read
  85.  
  86.     mov    dx,(offset ld_err - offset _boot_code)
  87.     jmp    short error
  88.  
  89. go_boot:
  90.     db    0ea,00,7c,00,00        ; jmp 0:7c00
  91. inv_table db    "Invalid partition table",0
  92. ld_err    db    "Error loading operating system",0
  93. no_sig    db    "Missing operating system",0
  94.  
  95. _bcode_len    dw    $-(offset _boot_code)
  96.  
  97. _DATA    ends
  98.     end
  99.